<?php

namespace CHOMP\SGIBundle\Controller;

use CHOMP\SGIBundle\Entity\Incidente;
use CHOMP\SGIBundle\Entity\Estado;
use CHOMP\SGIBundle\Entity\Prioridad;
use CHOMP\SGIBundle\Controller\DateInterval;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use CHOMP\SGIBundle\Entity\Rol;
use CHOMP\SGIBundle\Services\SessionManager;
use JMS\DiExtraBundle\Annotation as DI;
use Symfony\Component\HttpFoundation\Session\Session;
use CHOMP\SGIBundle\Exception\DeletedUserException;
use CHOMP\SGIBundle\Exception\ExpiredPasswordException;
use CHOMP\SGIBundle\Exception\EmptyValueException;
use CHOMP\SGIBundle\Exception\FirstTimeLoginException;
use CHOMP\SGIBundle\Exception\InactiveUserException;
use CHOMP\SGIBundle\Exception\IncorrectPasswordException;
use CHOMP\SGIBundle\Exception\InexistentEmpresaException;
use CHOMP\SGIBundle\Exception\InexistentUserException;
use CHOMP\SGIBundle\Exception\LockedUserException;
use CHOMP\SGIBundle\Exception\PermissionDeniedException;
use CHOMP\SGIBundle\Exception\LDAPErrorException;
use CHOMP\SGIBundle\Exception\LDAPPasswordNotChangedException;



class DefaultController extends Controller
{
	/**
	 * 
	 * @var SessionManager
	 * @DI\Inject("session.manager")
	 */	
	public $sessionSvc;


    public function indexAction(Request $request){	
    	try{
    		$this->sessionSvc->startSession();
    	
    	}catch(LDAPErrorException $e){
			$this->sessionSvc->addFlash('msgWarn','LDAP Usuario o Password Incorrecto');
		}catch(InexistentUserException $e){
			$this->sessionSvc->addFlash('msgWarn','Usuario inexistente');
		}catch(InexistentEmpresaException $e){
			$this->sessionSvc->addFlash('msgError','Su empresa ya no pertenece al sistema. Comuniquese con su administrador.');
		}
		/*
		catch(FirstTimeLoginException $e){
			$this->sessionSvc->addFlash('msgOk','Bienvenido! Por favor ingrese una nueva contraseña.');
			return $this->render('CHOMPSGIBundle:Default:cambioPass.html.twig', array('login' => $login, 'empresa' => $this->sessionSvc->getCurrentUser()->getEmpresa()));
		
		}*/catch(InactiveUserException $e){
			$this->sessionSvc->addFlash('msgInfo','El usuario se encuentra inactivo. Por favor contacte a su administrador.');
			return $this->render('CHOMPSGIBundle:Default:LdapExceptionsMessages.html.twig' );
		}catch(LockedUserException $e){
			$this->sessionSvc->addFlash('msgInfo','El usuario se encuentra bloqueado. Por favor contacte a su administrador.');
		}catch(DeletedUserException $e){
			$this->sessionSvc->addFlash('msgWarn','El usuario fue eliminado. Por favor contacte a su administrador.');
		}

		if ($this->sessionSvc->userIsLogged()){
			return $this->redirect($this->generateUrl('chompsgi_inicio'));
		}else{
			return $this->render('CHOMPSGIBundle:Default:index.html.twig' );
		}
    }

	
    public function validarAction(Request $request){
		$login = $request->get('usuario');
		$pass =	$request->get('contrasena');

		if (($login != '') && ($pass != '')){ 

			try{
				if ($this->sessionSvc->login($login, $pass, false))
					return $this->redirect($this->generateUrl('chompsgi_inicio'));
			}catch(LDAPErrorException $e){
				$this->sessionSvc->addFlash('msgWarn','LDAP Usuario o Password Incorrecto');
			}catch(InexistentUserException $e){
				$this->sessionSvc->addFlash('msgWarn','Usuario inexistente');
			}catch(IncorrectPasswordException $e){
				$this->sessionSvc->addFlash('msgError','La contraseña es incorrecta, por favor inténtelo de nuevo.');
			}catch(InexistentEmpresaException $e){
				$this->sessionSvc->addFlash('msgError','Su empresa ya no pertenece al sistema. Comuniquese con su administrador.');
			}catch(FirstTimeLoginException $e){
				$this->sessionSvc->addFlash('msgOk','Bienvenido! Por favor ingrese una nueva contraseña.');
				return $this->render('CHOMPSGIBundle:Default:cambioPass.html.twig', array('login' => $login, 'empresa' => $this->sessionSvc->getCurrentUser()->getEmpresa()));
			}catch(ExpiredPasswordException $e){
				$this->sessionSvc->setSession('firstPass', 'si');
				$this->sessionSvc->addFlash('msgInfo','Su contraseña ha expirado, por favor ingrese una nueva contraseña.');
				return $this->render('CHOMPSGIBundle:Default:cambioPass.html.twig', array('login' => $login));
			}catch(InactiveUserException $e){
				$this->sessionSvc->addFlash('msgInfo','El usuario se encuentra inactivo. Por favor contacte a su administrador.');
			}catch(LockedUserException $e){
				$this->sessionSvc->addFlash('msgInfo','El usuario se encuentra bloqueado. Por favor contacte a su administrador.');
			}catch(DeletedUserException $e){
				$this->sessionSvc->addFlash('msgWarn','El usuario fue eliminado. Por favor contacte a su administrador.');
			}
			return $this->render('CHOMPSGIBundle:Default:index.html.twig' );
			
		}else{
			$this->sessionSvc->addFlash('msgWarn','Debe completar ambos campos!');
			return $this->render('CHOMPSGIBundle:Default:index.html.twig');
		}
	}	
	

	public function cambiarClaveAction(Request $request, $login, $pass){
		
		try{
			$usuario = $this->sessionSvc->getCurrentUser();
			$this->sessionSvc->changePassword($login, $pass);
			$this->sessionSvc->addFlash('msgOk','Su contraseña fue modificada con éxito.');
		}catch(InexistentUserException $e0){
			$this->sessionSvc->addFlash('msgWarn','Usuario inexistente');
		}catch(PermissionDeniedException $e1){
			$this->sessionSvc->addFlash('msgError', 'No tiene permisos para ver la página.');
		}
		catch(Exception $e){
			$this->sessionSvc->addFlash('msgError','Error al modificar la contraseña. Por favor inténtelo de nuevo.');
			return $this->render('CHOMPSGIBundle:Default:preferencias.html.twig', array('entity' => $usuario, 'passWasChanged' => 'false'));
		}
		catch(LDAPPasswordNotChangedException $e){
            $this->sessionSvc->addFlash('msgWarn','LDAP Password No se puede modificar');
			return $this->render('CHOMPSGIBundle:Default:index.html.twig');
		}
		return $this->render('CHOMPSGIBundle:Default:inicio.html.twig');
	}
	


    public function restablecerClaveAction(Request $request)
    {	
        return $this->render('CHOMPSGIBundle:Default:olvideClave.html.twig');
    }
	

	public function olvideClaveAction(Request $request)
	{
		$nomUsuario = $request->get('login');
		
		try{
			$usuario = $this->sessionSvc->forgotPassword($nomUsuario);	
			//get password
			if($usuario->getPassword()!='passw0rd'){
				list($user, $password) = split("///", $usuario->getPassword());
				$pass = $this->sessionSvc->decryptIt($password);
			}else{
				$pass = $usuario->getPassword();
			}
			
			//crear mail y mandar
			$message = \Swift_Message::newInstance()
			->setSubject('Recuperacion de clave')
			->setFrom('corvalan4@gmail.com')
			->setTo($usuario->getEmail())
			->setBody(				
						$this->renderView('CHOMPSGIBundle:Default:email.txt.twig', array('login' => $usuario->getLogin(), 'pass' => $pass))										
					);
			$this->get('mailer')->send($message);

			//mensaje ok
			$this->sessionSvc->addFlash('msgOk','Su contraseña ha sido enviada a su dirección de correo electrónico.');	
			return $this->redirect($this->generateUrl('chompsgi_homepage'));
			
		}catch(EmptyValueException $e){
			$this->sessionSvc->addFlash('msgWarn','Debe completar el campo.');
		}catch(InexistentUserException $e1){
			$this->sessionSvc->addFlash('msgError', 'Nombre de usuario inexistente.');
		}catch(Swift_TransportException $e2){
			$this->sessionSvc->addFlash('msgError','Error al enviar correo electrónico. Por favor contacte a su administrador.');	
		}catch(Exception $e3){
			$this->sessionSvc->addFlash('msgError','Error buscando usuario o contraseña.');
			return $this->redirect($this->generateUrl('chompsgi_homepage'));
		}

		return $this->render('CHOMPSGIBundle:Default:olvideClave.html.twig');

	} 


	public function cerrarSesionAction(Request $request){
		$this->sessionSvc->closeSession();
		return $this->redirect($this->generateUrl('chompsgi_homepage'));
	}


	public function inicioAction(){
		if ($this->sessionSvc->userIsLogged()){
			if (!$this->sessionSvc->isGranted('VER_INICIO')){
				$this->sessionSvc->addFlash('msgError','No tiene permisos para ver ésta página.');	
				return $this->render('CHOMPSGIBundle:Default:index.html.twig');
			}
				
			$us = $this->sessionSvc->getCurrentUser();
			if($us->getRol()->getNombre()=='Administrador'){

				$workflows = $this->getDoctrine()->getRepository('CHOMPSGIBundle:Workflow')->getByEmmpresa($this->sessionSvc->getSession('empresa'));
				$cuentaAnalitica = $this->getDoctrine()->getRepository('CHOMPSGIBundle:CuentaAnalitica')->getByEmmpresa($this->sessionSvc->getSession('empresa'));
				$grupoSoporte = $this->getDoctrine()->getRepository('CHOMPSGIBundle:GrupoSoporte')->getByEmmpresa($this->sessionSvc->getSession('empresa'));
				
				if(count($grupoSoporte)<1){
					$this->sessionSvc->addFlash('msgWarn','Bienvenido! Debe dar de alta al menos un Grupo de Soporte.');				
					return $this->redirect($this->generateUrl('gruposoporte_nuevo'));
				}
				if(count($cuentaAnalitica)<1){
					$this->sessionSvc->addFlash('msgWarn','Bienvenido! Debe dar de alta al menos una Cuenta Analitica.');				
					return $this->redirect($this->generateUrl('cuentaAnalitica_nuevo'));
				}
				if(count($workflows)<1){
					$this->sessionSvc->addFlash('msgWarn','Bienvenido! Debe dar de alta al menos un Workflow.');				
					return $this->redirect($this->generateUrl('workflow_nuevo'));			
				}
			}		
			return $this->render('CHOMPSGIBundle:Default:inicio.html.twig');
		}else{
			return $this->redirect($this->generateUrl('chompsgi_homepage'));
		}
	}


    public function preferenciasAction(Request $request){	
		try{
			$usuario = $this->sessionSvc->getCurrentUser();
			return $this->render('CHOMPSGIBundle:Default:preferencias.html.twig', array('entity' => $usuario, 'passWasChanged' => 'false'));
		}catch(PermissionDeniedException $e){
			$this->sessionSvc->addFlash('msgError', 'No tiene permisos para ver la página.');
		}catch(InexistentUserException $e){
			$this->sessionSvc->addFlash('msgError', 'Nombre de usuario inexistente.');
		}
		return $this->render('CHOMPSGIBundle:Default:index.html.twig');		
    }


    
    public function cambiarPreferenciasAction(Request $request)
    {	
		try{
			$usuario = $this->sessionSvc->getCurrentUser();
		}catch(PermissionDeniedException $e){
			$this->sessionSvc->addFlash('msgError', 'No tiene permisos para ver la página.');
		}catch(InexistentUserException $e){
			$this->sessionSvc->addFlash('msgError', 'Nombre de usuario inexistente.');
		}

		$usuario->setNombre($request->get('nombre'));
		$usuario->setApellido($request->get('apellido'));
		$usuario->setTelefono($request->get('telefono'));
		$usuario->setEmail($request->get('email'));

		try{
			$this->getDoctrine()->getManager()->persist($usuario);
			$this->getDoctrine()->getManager()->flush();
			$this->sessionSvc->addFlash('msgOk', 'Sus datos fueron modificados exitosamente.');
		}catch(Exception $e){
			$this->sessionSvc->addFlash('msgError', 'Error modificando usuario. Por favor intentelo de nuevo.');
		}		
		return $this->render('CHOMPSGIBundle:Default:preferencias.html.twig', array('entity' => $usuario, 'passWasChanged' => 'false'));
		
    }

    public function testLDAPAction(Request $request){
    	return $this->render('CHOMPSGIBundle:TestLDAP:index.html');

    }


} 
